home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Programming / AmigaTalk / User / Fraction.st < prev    next >
Text File  |  2000-05-08  |  4KB  |  160 lines

  1. " ------------------------------------------------------------- "
  2. " Fraction.st - Implementation of fraction number class for     "
  3. "               AmigaTalk.                                      "
  4. " ------------------------------------------------------------- "
  5.  
  6. Class Fraction :Magnitude
  7. ! n d ratio !
  8. [
  9.   new
  10.     n     <- Float new: 0.0.
  11.     d     <- Float new: 1.0.
  12.     ratio <- Float new: 0.0
  13. |
  14.   numerator
  15.     ^n
  16. |
  17.   denominator
  18.     ^d
  19. |
  20.   fraction
  21.     ^ratio
  22. |
  23.   asFloat
  24.     (d == 0.0)
  25.       ifTrue: [ <primitive 123 'Improper fraction (x / 0.0)!'>.
  26.                 ^ nil 
  27.               ].
  28.       
  29.     ^ratio <- (n / d)
  30. |
  31.   coerce: aNumber ! newFraction !
  32.     newFraction <- Fraction new.
  33.  
  34.     newFraction numerator:   aNumber.
  35.     newFraction denominator: 1.0.
  36.     newFraction fraction:    aNumber.
  37.  
  38.     ^ newFraction
  39. |
  40.   numerator: newNum
  41.     n <- newNum
  42. |
  43.   denominator: newDenom
  44.     d <- newDenom
  45. |
  46.   fraction: newFrac
  47.     ratio <- newFrac
  48. |
  49.   reciprocal ! temp !
  50.     (n == 0.0)
  51.       ifTrue: [ <primitive 123 'Reciprocal: Improper fraction (x / 0.0)!'>.
  52.                 ^ nil 
  53.               ].
  54.     temp <- n.
  55.     n    <- d.
  56.     d    <- temp.
  57.     ^ ratio <- (n / d)    
  58. |
  59.   + aNumber ! tn td nc !
  60.     (aNumber isKindOf: (self class))
  61.       ifFalse: [ nc <- self coerce: aNumber ]
  62.       ifTrue:  [ nc <- aNumber              ].
  63.  
  64.     td           <- d  * (nc denominator).
  65.     tn           <- n  * (nc denominator).
  66.     nc numerator:   d  * (nc numerator).
  67.     n            <- tn + (nc numerator).
  68.     d            <- td.
  69.     ^ ratio <- (n / d)
  70. |
  71.   - aNumber ! tn td nc !
  72.     (aNumber isKindOf: (self class))
  73.       ifFalse: [ nc <- self coerce: aNumber ]
  74.       ifTrue:  [ nc <- aNumber              ].
  75.  
  76.     td                <- d  * (nc denominator).
  77.     tn                <- n  * (nc denominator).
  78.     aNumber numerator:   d  * (nc numerator).
  79.     n                 <- tn - (nc numerator).
  80.     d                 <- td.
  81.     ^ ratio <- (n / d)
  82. |
  83.   * aNumber ! nc !
  84.  
  85.     (aNumber isKindOf: (self class))
  86.       ifFalse: [ nc <- self coerce: aNumber ]
  87.       ifTrue:  [ nc <- aNumber              ].
  88.  
  89.     n <- n * (nc numerator).
  90.     d <- d * (nc denominator).
  91.     ^ ratio <- (n / d)
  92. |
  93.   / aNumber ! nf !
  94.  
  95.     (aNumber isKindOf: (self class))
  96.       ifFalse: [ nf <- self coerce: aNumber ]
  97.       ifTrue:  [ nf <- aNumber              ].
  98.    
  99.     ^ self * (nf reciprocal)
  100. |
  101.   printString ! str !
  102.     (<primitive 78 n>, ' / ', <primitive 78 d>) print
  103. |
  104.   == aNumber ! nc !
  105.  
  106.     (aNumber isKindOf: (self class))
  107.       ifFalse: [ nc <- self coerce: aNumber ]
  108.       ifTrue:  [ nc <- aNumber              ].
  109.  
  110.     ((n == nc numerator) & (d == nc denominator))
  111.       ifTrue:  [ ^ true  ]
  112.       ifFalse: [ ^ false ]
  113. |
  114.   ~= aNumber ! nc !
  115.  
  116.     (aNumber isKindOf: (self class))
  117.       ifFalse: [ nc <- self coerce: aNumber ]
  118.       ifTrue:  [ nc <- aNumber              ].
  119.  
  120.     ((n ~= nc numerator) & (d ~= nc denominator))
  121.       ifTrue:  [ ^ true  ]
  122.       ifFalse: [ ^ false ]
  123. |
  124.   <  aNumber ! nc !
  125.     (aNumber isKindOf: (self class))
  126.       ifFalse: [ nc <- self coerce: aNumber ]
  127.       ifTrue:  [ nc <- aNumber              ].
  128.  
  129.     (ratio < nc fraction)
  130.       ifTrue:  [ ^ true  ]
  131.       ifFalse: [ ^ false ]
  132. |
  133.   >  aNumber ! nc !
  134.     (aNumber isKindOf: (self class))
  135.       ifFalse: [ nc <- self coerce: aNumber ]
  136.       ifTrue:  [ nc <- aNumber              ].
  137.  
  138.     (ratio > nc fraction)
  139.       ifTrue:  [ ^ true  ]
  140.       ifFalse: [ ^ false ]
  141. |
  142.   <= aNumber ! nc !
  143.     (aNumber isKindOf: (self class))
  144.       ifFalse: [ nc <- self coerce: aNumber ]
  145.       ifTrue:  [ nc <- aNumber              ].
  146.  
  147.     (ratio <= nc fraction)
  148.       ifTrue:  [ ^ true  ]
  149.       ifFalse: [ ^ false ]
  150. |
  151.   >= aNumber ! nc !
  152.     (aNumber isKindOf: (self class))
  153.       ifFalse: [ nc <- self coerce: aNumber ]
  154.       ifTrue:  [ nc <- aNumber              ].
  155.  
  156.     (ratio >= nc fraction)
  157.       ifTrue:  [ ^ true  ]
  158.       ifFalse: [ ^ false ]
  159. ]
  160.